package com.example;

import java.io.*;

// BufferedReader 中的 read() 和 readline()
public class BeffereReaderTest {

    public static void main(String[] args) {
        testBefferedCreated();
        testBefferedReadline();

    }

    // System.in : 标准输入流，连接到控制台输入
    // InputStreamReader : 将字节流转换为字符流
    // BufferedReader : 带缓冲的字符输入流，提供更高效的读取，可以读取文本内容（字符流），提供按行读取的能力 (readLine())
    // 1. System.in 是标准输入流,是InputStream类型;
    // 2. System.out 是标准输出流,是PrintStream类型;
    // 3. System.err 是标准错误流,是PrintStream类型;
    // 5. System.out 是标准输出流,是PrintStream类型;
    // 6. System.err 是标准错误流,是PrintStream类型;
    // 注意事项：
    // 1. read() 和 readLine() 都是阻塞方法,会等待用户输入;
    // 2. 使用完后应该关闭 BufferedReader（使用try - with - resources自动关闭）;
    // 3. 需要处理可能的 IOException;
    // 4. read() 方法返回的是int类型,需要转换为char;
    // 5. 当输入流结束时,read() 返回 - 1;readLine() 返回null
    public static void testBefferedCreated() {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        char c;
        System.out.println("输入字符, 按下 'q' 键退出。");
        try {
            // 每次调用read()方法，,它从输入流读取一个字符串并把该字符串作为整数值返回。当流结束的时候返回-1
            // 什么时候会走do里面的内容？
            do {
                c = (char) reader.read();
                System.out.println(c);
                // 如果用户输入了 "Hello" 并按回车
                // 程序会这样执行：
                // 1. 第一次循环读取 'H'
                // 2. 第二次循环读取 'e'
                // 3. 第三次循环读取 'l'
                // 4. 第四次循环读取 'l'
                // 5. 第五次循环读取 'o'
                // 6. 第六次循环读取 '\r' (回车符)
                // 7. 第七次循环读取 '\n' (换行符)
            } while (c != 'q');
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void testBefferedReadline() {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String str;
        System.out.println("输入字符串, 按下 'end' 键退出。");
        try {
            do {
                str = reader.readLine();
                System.out.println(str);
            } while (!str.equals("end"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
